/**
 * 项目统一类型定义文件
 * 替代所有 any 类型的标准接口定义
 *
 * 使用规范:
 * 1. 所有API请求参数使用具体的Input类型
 * 2. 所有API响应数据使用具体的Output/Response类型
 * 3. 所有React组件Props使用接口定义
 * 4. 所有Vue组件State使用接口定义
 * 5. 禁止使用 any 类型，除非有明确的业务理由
 */

// ============== 通用基础类型 ==============

/**
 * 分页查询请求参数
 */
export interface PageRequest<T = Record<string, any>> {
  /** 页码 */
  page: number;
  /** 每页数量 */
  pageSize: number;
  /** 排序字段 */
  sortField?: string;
  /** 排序方向 asc/desc */
  sortOrder?: 'asc' | 'desc';
  /** 搜索关键词 */
  keyword?: string;
  /** 扩展查询条件 */
  [key: string]: any;
}

/**
 * 分页响应数据
 */
export interface PageResponse<T = any> {
  /** 数据列表 */
  items: T[];
  /** 总数 */
  total: number;
  /** 页码 */
  page: number;
  /** 每页数量 */
  pageSize: number;
}

/**
 * API统一响应格式
 */
export interface ApiResponse<T = any> {
  /** 状态码 */
  code: number;
  /** 消息 */
  message: string;
  /** 数据 */
  data?: T;
  /** 成功标志 */
  success: boolean;
}

/**
 * 通用ID查询请求
 */
export interface IdRequest {
  id: number | string;
}

/**
 * 通用删除请求
 */
export interface DeleteRequest {
  id: number | string;
}

/**
 * 通用批量删除请求
 */
export interface BatchDeleteRequest {
  ids: (number | string)[];
}

// ============== 业务枚举类型 ==============

/**
 * 流程类型枚举
 */
export enum FlowTypeEnum {
  /** 入库 */
  Inbound = '入库',
  /** 出库 */
  Outbound = '出库',
}

/**
 * 审批状态枚举
 */
export enum ApprovalStatusEnum {
  /** 待审核 */
  Pending = 0,
  /** 已审核 */
  Reviewed = 1,
  /** 已批准 */
  Approved = 2,
  /** 已拒绝 */
  Rejected = 3,
  /** 已完成 */
  Completed = 4,
}

/**
 * 计划完成状态枚举
 */
export enum PlanStatusEnum {
  /** 未完成 */
  UnFinish = 0,
  /** 已完成 */
  Finish = 1,
}

/**
 * 库存状态枚举
 */
export enum StockStatusEnum {
  /** 正常 */
  Normal = 0,
  /** 预警 */
  Warning = 1,
  /** 缺货 */
  OutOfStock = 2,
}

// ============== 计划管理类型 ==============

/**
 * 计划列表项
 */
export interface PlanListItem {
  id: number;
  /** 船号 */
  ch: string;
  /** 分段 */
  fd: string;
  /** 分类ID */
  className: number;
  /** 分类名称 */
  classNameFkDisplayName: string;
  /** 作业区域ID */
  workAreaId: number;
  /** 作业区域名称 */
  workAreaFkDisplayName: string;
  /** 劳务队 */
  team: string;
  /** 计划开始 */
  planStart: string | Date;
  /** 计划完成 */
  planEnd: string | Date;
  /** 实际开始 */
  actualStart?: string | Date;
  /** 实际完成 */
  actualEnd?: string | Date;
  /** 备注 */
  remark?: string;
  /** 状态 */
  status: PlanStatusEnum;
  /** 开工延期原因 */
  startDelayReason?: string;
  /** 完工延期原因 */
  endDelayReason?: string;
  /** 开工延迟天数 */
  startDelayDays?: number;
  /** 完工延迟天数 */
  endDelayDays?: number;
  /** 创建时间 */
  createTime: string | Date;
  /** 更新时间 */
  updateTime?: string | Date;
}

/**
 * 计划查询请求
 */
export interface PlanListRequest extends PageRequest {
  /** 船号 */
  ch?: string;
  /** 分段 */
  fd?: string;
  /** 分类ID */
  className?: number;
  /** 作业区域ID */
  workAreaId?: number;
  /** 计划开始日期范围 */
  planStartRange?: [string | Date, string | Date];
  /** 计划完成日期范围 */
  planEndRange?: [string | Date, string | Date];
  /** 实际开始日期范围 */
  actualStartRange?: [string | Date, string | Date];
  /** 实际完成日期范围 */
  actualEndRange?: [string | Date, string | Date];
  /** 状态 */
  status?: PlanStatusEnum;
}

/**
 * 计划创建/更新请求
 */
export interface PlanListUpsertRequest {
  id?: number;
  ch: string;
  fd: string;
  className: number;
  workAreaId: number;
  team: string;
  planStart: string | Date;
  planEnd: string | Date;
  actualStart?: string | Date;
  actualEnd?: string | Date;
  remark?: string;
  startDelayReason?: string;
  endDelayReason?: string;
}

// ============== 物资管理类型 ==============

/**
 * 物资列表项
 */
export interface StoreMaterialsItem {
  id: number;
  /** 分类ID */
  storeTypeId: number;
  /** 分类显示名称 */
  storeTypeDisplayName: string;
  /** 物资名称 */
  name: string;
  /** 单位 */
  unit: string;
  /** 单价 */
  price: number;
  /** 最小库存 */
  minStock: number;
  /** 最大库存 */
  maxStock: number;
  /** 当前库存 */
  currentStock: number;
  /** 可用库存 */
  availableStock: number;
  /** 预留库存 */
  reservedStock: number;
  /** 在途库存 */
  inTransitStock: number;
  /** 库存状态 */
  stockStatus: StockStatusEnum;
  /** 创建时间 */
  createTime: string | Date;
}

/**
 * 物资查询请求
 */
export interface StoreMaterialsRequest extends PageRequest {
  /** 物资名称 */
  name?: string;
  /** 分类ID */
  storeTypeId?: number;
  /** 库存状态 */
  stockStatus?: StockStatusEnum;
}

/**
 * 物资创建/更新请求
 */
export interface StoreMaterialsUpsertRequest {
  id?: number;
  storeTypeId: number;
  name: string;
  unit: string;
  price: number;
  minStock: number;
  maxStock: number;
  currentStock?: number;
}

// ============== 审批流程类型 ==============

/**
 * 审批流程步骤项
 */
export interface StoreProcessFlowStepItem {
  id: number;
  /** 流程类型 */
  flowType: FlowTypeEnum | string;
  /** 批号 */
  batchNo: string;
  /** 请求号 */
  requestNo: string;
  /** 物资分类ID */
  storeTypeId: number;
  /** 物资分类名称 */
  storeTypeDisplayName: string;
  /** 物资ID */
  materialId: number;
  /** 物资名称 */
  materialName: string;
  /** 数量 */
  quantity: number;
  /** 单位 */
  unit: string;
  /** 申请人ID */
  applicantId: number;
  /** 申请人名称 */
  applicantName: string;
  /** 申请人部门 */
  applicantDept: string;
  /** 接收人ID */
  receiverId: number;
  /** 接收人名称 */
  receiverName: string;
  /** 接收人部门 */
  receiverDept: string;
  /** 请求时间 */
  requestTime: string | Date;
  /** 期望日期 */
  expectedDate: string | Date;
  /** 完成时间 */
  completedTime?: string | Date;
  /** 审批状态 */
  approvalAction: ApprovalStatusEnum;
  /** 确认人ID */
  confirmerId?: number;
  /** 确认人名称 */
  confirmerName?: string;
  /** 备注 */
  remark?: string;
}

/**
 * 审批流程查询请求
 */
export interface StoreProcessFlowStepRequest extends PageRequest {
  /** 流程类型 */
  flowType?: string;
  /** 批号 */
  batchNo?: string;
  /** 请求号 */
  requestNo?: string;
  /** 物资分类ID */
  storeTypeId?: number;
  /** 物资ID */
  materialId?: number;
  /** 申请人ID */
  applicantId?: number;
  /** 接收人ID */
  receiverId?: number;
  /** 请求时间范围 */
  requestTimeRange?: [string | Date, string | Date];
  /** 当前用户ID */
  currentUserId?: number;
  /** 我的审批历史 */
  myApprovalHistory?: boolean;
}

/**
 * 审批流程更新请求
 */
export interface StoreProcessFlowStepUpdateRequest {
  id: number;
  confirmerId?: number;
  approvalAction: ApprovalStatusEnum;
  remark?: string;
}

// ============== 下拉列表响应类型 ==============

/**
 * 下拉列表项
 */
export interface DropdownItem {
  /** 值 */
  value: number | string | null;
  /** 显示文本 */
  label: string;
  /** 子项 */
  children?: DropdownItem[];
}

/**
 * 下拉列表响应
 */
export interface DropdownResponse {
  [key: string]: DropdownItem[];
}

// ============== 统计/报表类型 ==============

/**
 * 统计卡片数据
 */
export interface StatisticsCard {
  /** 标题 */
  title: string;
  /** 数值 */
  value: number | string;
  /** 单位 */
  unit?: string;
  /** 趋势 up/down/flat */
  trend?: 'up' | 'down' | 'flat';
  /** 趋势百分比 */
  trendPercent?: number;
  /** 颜色 */
  color?: string;
}

/**
 * 图表数据点
 */
export interface ChartPoint {
  /** 日期或X轴标签 */
  date: string;
  /** 计划开始 */
  planStart?: number;
  /** 计划完成 */
  planEnd?: number;
  /** 实际开始 */
  actualStart?: number;
  /** 实际完成 */
  actualEnd?: number;
  [key: string]: any;
}

/**
 * 延期数据
 */
export interface DelayData {
  /** 船号 */
  ch: string;
  /** 分段 */
  fd: string;
  /** 分类名称 */
  className: string;
  /** 作业区域 */
  workArea: string;
  /** 延期天数 */
  delay: number;
  /** 计划开始 */
  planStart: string | Date;
  /** 计划完成 */
  planEnd: string | Date;
  /** 实际开始 */
  actualStart?: string | Date;
  /** 实际完成 */
  actualEnd?: string | Date;
}

// ============== Vue组件状态类型 ==============

/**
 * 表格查询状态
 */
export interface TableQueryState<T = any> {
  /** 表格数据列表 */
  tableData: T[];
  /** 表格加载中 */
  tableLoading: boolean;
  /** 总数 */
  total: number;
  /** 查询参数 */
  queryParams: PageRequest;
  /** 选中的行 */
  selectedRows?: T[];
  /** 删除中的ID */
  deletingId?: number;
}

/**
 * 对话框表单状态
 */
export interface DialogFormState<T = any> {
  /** 对话框可见性 */
  visible: boolean;
  /** 对话框标题 */
  title: string;
  /** 表单数据 */
  formData: T;
  /** 表单加载中 */
  loading: boolean;
  /** 表单验证错误 */
  errors?: Record<string, string>;
  /** 是否为编辑模式 */
  isEdit: boolean;
}

/**
 * 下拉列表状态
 */
export interface DropdownState {
  /** 下拉列表数据 */
  dropdownData: DropdownResponse;
  /** 加载中 */
  loading: boolean;
  /** 错误信息 */
  error?: string;
}

// ============== API服务类型 ==============

/**
 * 通用CRUD服务接口
 */
export interface CrudService<T, CreateReq, UpdateReq> {
  /** 分页查询 */
  page(params: PageRequest): Promise<ApiResponse<PageResponse<T>>>;
  /** 获取详情 */
  detail(id: number | string): Promise<ApiResponse<T>>;
  /** 新增 */
  add(data: CreateReq): Promise<ApiResponse<{ id: number }>>;
  /** 更新 */
  update(data: UpdateReq): Promise<ApiResponse<null>>;
  /** 删除 */
  delete(id: number | string): Promise<ApiResponse<null>>;
  /** 批量删除 */
  batchDelete(ids: (number | string)[]): Promise<ApiResponse<null>>;
  /** 获取下拉列表 */
  dropdownData?(params?: Record<string, any>): Promise<ApiResponse<DropdownResponse>>;
}

// ============== 导出所有类型 ==============

export type * from './plan-types';
export type * from './material-types';
export type * from './approval-types';
